﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace ThreadTest
{
     class Program
    {

        private static readonly object progarmobject = new object();

        public static List<Exception>  ex = new List<Exception>() ;
        static void Main(string[] args)
        {


            try
            {
                List<Task> ss = new List<Task>();
                ss.Add( Task.Run(() =>
                {
                    Task.Delay(1000).Wait();
                }));
                ss.Add(Task.Run(() =>
                {
                    Task.Delay(1000).Wait();
                    ex.Add(new Exception("ssssss"));
                }));
                Task.WaitAll(ss.ToArray());
                if (ex.Count > 0)
                {
                    throw new Exception("ee");
                }
            }
            catch (Exception  e)
            {

                throw;
            }

          




           // Console.WriteLine("Hello World!");
           // //Task.Run(() => { MasThread(); }); 
           // Console.WriteLine("多线程执行中....");
           // //List<Task<int>> list = new List<Task<int>>();


           // //  TaskDelayTest();

           // //TestInvoke();
           //// ThreadSleepTest();
           // int m = 0;
           // //List<Task> ss = new List<Task>();
           // //for (int i = 0; i < 100; i++)
           // //{
           // //    Console.WriteLine($"多线程第={i}");
           // //    ss.Add(Task.Run(()=> {
           // //        //Thread.Sleep(10);
           // //        m = m + 1;
           // //    }));
           // //}
           // //Task.WhenAll(ss.ToArray());

           // //TestInvoke();




           // //() =>
           // //{
           // //    Console.WriteLine($"m={m}");
           // //}


           // //List<int> ts = new List<int>();

           // //for (int i = 0; i < 100; i++)
           // //{
           // //    ts.Add(i);
           // //}


           // //Parallel.For(0, 100, (i) =>
           // //{
           // //    Thread.Sleep(10);
           // //    m = m + 1;
           // //    Console.WriteLine($"{i}次 {Thread.CurrentThread.ManagedThreadId}");
           // //});


           // //Parallel.ForEach<int>(ts, new ParallelOptions { MaxDegreeOfParallelism = 5 }, (i) =>
           // //{
           // //    //lock (progarmobject)
           // //    //{
           // //        m = m + 1;
           // //        Console.WriteLine($"m{m}");
           // //    //}
           // //    Thread.Sleep(10);
           // //});


           // thread thread = new thread();
           // //thread.tx();

           // //Console.WriteLine($"m={m}");

           // //list.Add(Task<int>.Run(() => { return Dosomething(); }));
           // //list.Add(Task<int>.Run(() => { return Dosomething1(); }));
           // //Task.WhenAny(list.ToArray()).ContinueWith(x=> {
           // //    Console.WriteLine($"线程Id：{x.Result.Result}率先执行完成  【{Thread.CurrentThread.ManagedThreadId}】");
           // //});







            Console.ReadKey();

        }


        static void TestInvoke()
        {
            Action<string> ss = (x) =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("bb");
            };

            ss.BeginInvoke("ss", (x) =>
            {
                Console.WriteLine("cc");
            }, null);
            Console.WriteLine("aaa");

        }

        private static void MasThread()
        {
            List<int> ls = new List<int>();
            for (int i = 0; i < 10000; i++)
            {
                ls.Add(i);
            }

            List<Task> lstask = new List<Task>();


            foreach (var s in ls)
            {
                int k = s;
                lstask.Add(Task.Run(() =>
                {
                    Thread.Sleep(1);
                    //  Console.WriteLine($"当前线程{Thread.CurrentThread.ManagedThreadId},数值为：{k}");
                }));

                if (lstask.Count > 10)
                {
                    Task.WaitAll(lstask.ToArray());
                    lstask = lstask.Where(x => x.Status != TaskStatus.RanToCompletion).ToList();
                }
            }

            Task.WhenAll(lstask.ToArray()).ContinueWith((x) =>
            {
                Console.WriteLine("10000条线程执行完成");
            });





        }

        private static int Dosomething1()
        {
            Thread.Sleep(4000);
            Console.WriteLine($"线程名称：{Thread.CurrentThread.ManagedThreadId}，执行");
            return Thread.CurrentThread.ManagedThreadId;
        }

        private static int Dosomething()
        {
            Thread.Sleep(3000);
            Console.WriteLine($"线程名称：{Thread.CurrentThread.ManagedThreadId}，执行");
            return Thread.CurrentThread.ManagedThreadId;
        }




        private static void TaskDelayTest()
        {

            using  (CancellationTokenSource cts = new CancellationTokenSource())
            {

                Task.Delay(13000, cts.Token).ContinueWith((x) => { Console.WriteLine("测试delay"); });
                Console.WriteLine("test");
                Thread.Sleep(2000);
                cts.Cancel();
            }
        }


        private static void ThreadSleepTest()
        {
            Thread.Sleep(3000);
            Console.WriteLine("test");
        }


    }
}
